{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LightGBM模型调优\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import lightgbm as lgbm\n",
    "from lightgbm.sklearn import LGBMClassifier\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "# 读取数据\n",
    "#dpath = './data/'\n",
    "train = pd.read_csv(\"FE_train.csv\")\n",
    "#train=train.replace('N','NAN',inplace=True)\n",
    "#train=train.replace('HBXX','NAN',inplace=True)\n",
    "train.fillna(0,inplace=True)\n",
    "y_train = train['Disbursed'] \n",
    "X_train = train.drop([\"ID\", \"Disbursed\"], axis=1)\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由于在后面数据建模调参发现原始数据存在问题，所以这里将数据处理后，再将数据NAN值替换为0进行建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>City</th>\n",
       "      <th>Device_Type</th>\n",
       "      <th>Disbursed</th>\n",
       "      <th>EMI_Loan_Submitted</th>\n",
       "      <th>Employer_Name</th>\n",
       "      <th>Existing_EMI</th>\n",
       "      <th>Filled_Form</th>\n",
       "      <th>Gender</th>\n",
       "      <th>ID</th>\n",
       "      <th>Interest_Rate</th>\n",
       "      <th>...</th>\n",
       "      <th>Mobile_Verified</th>\n",
       "      <th>Monthly_Income</th>\n",
       "      <th>Processing_Fee</th>\n",
       "      <th>Salary_Account</th>\n",
       "      <th>Source</th>\n",
       "      <th>Var1</th>\n",
       "      <th>Var2</th>\n",
       "      <th>Var4</th>\n",
       "      <th>Var5</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>ID000002C20</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>20000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>15</td>\n",
       "      <td>1</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>44</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6762.9</td>\n",
       "      <td>227</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000004E40</td>\n",
       "      <td>13.25</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>35000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>17</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>3</td>\n",
       "      <td>13</td>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000007H20</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>22500</td>\n",
       "      <td>0.0</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>192</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000008I30</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>35000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>37</td>\n",
       "      <td>9</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>10</td>\n",
       "      <td>28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>6</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>192</td>\n",
       "      <td>25000.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>ID000009J40</td>\n",
       "      <td>0.00</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>100000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>13</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>17</td>\n",
       "      <td>31</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   City  Device_Type  Disbursed  EMI_Loan_Submitted  Employer_Name  \\\n",
       "0    15            2        0.0                 0.0            192   \n",
       "1    44            2        0.0              6762.9            227   \n",
       "2    52            2        0.0                 0.0            192   \n",
       "3    52            2        0.0                 0.0            192   \n",
       "4     6            2        0.0                 0.0            192   \n",
       "\n",
       "   Existing_EMI  Filled_Form  Gender           ID  Interest_Rate ...   \\\n",
       "0           0.0            1       0  ID000002C20           0.00 ...    \n",
       "1           0.0            1       1  ID000004E40          13.25 ...    \n",
       "2           0.0            1       1  ID000007H20           0.00 ...    \n",
       "3           0.0            1       1  ID000008I30           0.00 ...    \n",
       "4       25000.0            1       1  ID000009J40           0.00 ...    \n",
       "\n",
       "   Mobile_Verified  Monthly_Income  Processing_Fee  Salary_Account  Source  \\\n",
       "0                1           20000             0.0              15       1   \n",
       "1                2           35000             0.0              17       1   \n",
       "2                2           22500             0.0              37       9   \n",
       "3                2           35000             0.0              37       9   \n",
       "4                2          100000             0.0              15       6   \n",
       "\n",
       "   Var1  Var2  Var4  Var5  Age  \n",
       "0    13     6     1     0   37  \n",
       "1     8     6     3    13   30  \n",
       "2    13     1     1     0   34  \n",
       "3    13     1     3    10   28  \n",
       "4    13     1     3    17   31  \n",
       "\n",
       "[5 rows x 24 columns]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 87020 entries, 0 to 87019\n",
      "Data columns (total 24 columns):\n",
      "City                     87020 non-null int64\n",
      "Device_Type              87020 non-null int64\n",
      "Disbursed                87020 non-null float64\n",
      "EMI_Loan_Submitted       87020 non-null float64\n",
      "Employer_Name            87020 non-null int64\n",
      "Existing_EMI             87020 non-null float64\n",
      "Filled_Form              87020 non-null int64\n",
      "Gender                   87020 non-null int64\n",
      "ID                       87020 non-null object\n",
      "Interest_Rate            87020 non-null float64\n",
      "Loan_Amount_Applied      87020 non-null float64\n",
      "Loan_Amount_Submitted    87020 non-null float64\n",
      "Loan_Tenure_Applied      87020 non-null float64\n",
      "Loan_Tenure_Submitted    87020 non-null float64\n",
      "Mobile_Verified          87020 non-null int64\n",
      "Monthly_Income           87020 non-null int64\n",
      "Processing_Fee           87020 non-null float64\n",
      "Salary_Account           87020 non-null int64\n",
      "Source                   87020 non-null int64\n",
      "Var1                     87020 non-null int64\n",
      "Var2                     87020 non-null int64\n",
      "Var4                     87020 non-null int64\n",
      "Var5                     87020 non-null int64\n",
      "Age                      87020 non-null int64\n",
      "dtypes: float64(9), int64(14), object(1)\n",
      "memory usage: 15.9+ MB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LightGBM超参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LightGBM的主要的超参包括：\n",
    "1. 树的数目n_estimators 和 学习率 learning_rate\n",
    "2. 树的最大深度max_depth 和 树的最大叶子节点数目num_leaves（LightGBM采用叶子优先的方式生成树，num_leaves很重要，设置成比 2^max_depth 小）\n",
    "3. 叶子结点的最小样本数:min_data_in_leaf(min_data, min_child_samples)\n",
    "4. 每棵树的列采样比例：feature_fraction/colsample_bytree\n",
    "5. 每棵树的行采样比例：bagging_fraction （需同时设置bagging_freq=1）/subsample\n",
    "6. 正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)\n",
    "\n",
    "7. 两个非模型复杂度参数，但会影响模型速度和精度。可根据特征取值范围和样本数目修改这两个参数\n",
    "1）特征的最大bin数目max_bin：默认255；\n",
    "2）用来建立直方图的样本数目subsample_for_bin：默认200000。\n",
    "\n",
    "对n_estimators，用LightGBM内嵌的cv函数调优，因为同XGBoost一样，LightGBM学习的过程内嵌了cv，速度极快。\n",
    "其他参数用GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "MAX_ROUNDS = 10000"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 相同的交叉验证分组\n",
    "样本数太多（87020），CV折数越多，cv性能越好。\n",
    "可能是由于GBDT是很复杂的模型，其实数据越多越好（cv折数多，每次留出的样本少，参数模型训练的样本更多）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "#直接调用lightgbm内嵌的交叉验证(cv)，可对连续的n_estimators参数进行快速交叉验证\n",
    "#而GridSearchCV只能对有限个参数进行交叉验证，且速度相对较慢\n",
    "def get_n_estimators(params , X_train , y_train , early_stopping_rounds=10):\n",
    "    lgbm_params = params.copy()\n",
    "     \n",
    "    lgbmtrain = lgbm.Dataset(X_train , y_train )\n",
    "     \n",
    "    #num_boost_round为弱分类器数目，下面的代码参数里因为已经设置了early_stopping_rounds\n",
    "    #即性能未提升的次数超过过早停止设置的数值，则停止训练\n",
    "    cv_result = lgbm.cv(lgbm_params , lgbmtrain , num_boost_round=MAX_ROUNDS , nfold=5,  metrics='auc' , early_stopping_rounds=early_stopping_rounds,seed=3 )\n",
    "     \n",
    "    print('best n_estimators:' , len(cv_result['auc-mean']))\n",
    "    print('best cv score:' , cv_result['auc-mean'][-1])\n",
    "     \n",
    "    return len(cv_result['auc-mean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 41\n",
      "best cv score: 0.8221269777030795\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          #'categorical_feature': names:'City', 'Employer_Name', 'Salary_Account','Device_Type','Filled_Form','Gender','Mobile_Verified','Source','Var1','Var2','Var4',\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "          'verbosity':5\n",
    "         }\n",
    "\n",
    "#categorical_feature = ['City', 'Employer_Name', 'Salary_Account','Device_Type','Filled_Form','Gender','Mobile_Verified','Source','Var1','Var2','Var4']\n",
    "n_estimators_1 = get_n_estimators(params, X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. num_leaves & max_depth=7\n",
    "num_leaves建议70-80，搜索区间50-80,值越大模型越复杂，越容易过拟合\n",
    "相应的扩大max_depth=7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:   26.3s\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:   41.2s remaining:    4.5s\n",
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:   42.9s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=6,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'num_leaves': range(50, 90, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          #'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "num_leaves_s = range(50,90,10) #50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.823901336572643\n",
      "{'num_leaves': 70}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAELCAYAAADp1+D/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XmUVOW97//3h26aZkYEFBlkximOrUaNQ5hMPDEmMRo98aiJv2i8kZsgOfenvxWzEte9697kqolJjERziInnRCVGPZ3EIyDgGKI0AiKGWYQGhQYigzJ19/f3R+3GommgG7pqd3V/Xmv1qqqnnr3r+7C768Oza9feigjMzMzypV3aBZiZWdvi4DEzs7xy8JiZWV45eMzMLK8cPGZmllcOHjMzyysHj5mZ5ZWDx8zM8srBY2ZmeVWcdgEtUa9evWLQoEFpl2FmVlDmzp27MSJ6H6qfg6cBgwYNoqKiIu0yzMwKiqR3G9PPu9rMzCyvHDxmZpZXDh4zM8srB4+ZmeWVg8fMzPLKwWNmZnmV0+CR9BlJSyQtl3RHA88PlDRL0jxJb0q6LGkfK2mupIXJ7aisZZ6TtEDSIkmTJBUl7adJmp0s8ydJ3bKWuTOpYYmkS3M5ZjMzO7icfY8nCYQHgLFAJTBHUnlEvJ3V7XvAlIh4UNJJwLPAIGAjcHlErJN0CjAV6Jcsc3VEbJUk4EngKuBx4NfAdyPiRUlfB/4VuCtZ7zXAycBxwPOSRkRETa7GbmYHt6u6hmfmrWV3dW3apVg9xx/dmYtGHPI7oEckl18gPQdYHhErASQ9DlwBZAdPAHUzk+7AOoCImJfVZxFQKqlDROyKiK1ZtZck6wAYCbyU3J9OJqzuSl7z8YjYBbwjaXlS2+zmGqiZNc3DL63knmlL0y7DGvC5U/sWdPD0A9ZkPa4Ezq3X5wfANEnjgc7AmAbWcyUwLwkOACRNJRMe/0Vm1gPwFvB54D/JzIIGZNXxt3p19KMeSTcDNwMMHDjwkIMzs8Oz5aM9/OqllYw6oQ8//vKpaZdj9ZQU5/6j/1wGjxpoi3qPrwUeiYh7JZ0HPCrplIioBZB0MvAjYNw+K4m4VFIp8B/AKDIznK8DP5P0faAc2N2EOoiIh4CHAMrKyvZ73syax69fWcm2ndVMHDeCXl06pF2OpSCX0VbJx7MOgP4ku9Ky3ARMAYiI2UAp0AtAUn/gaeD6iFhRf+URsZNMwFyRPF4cEeMi4izgMaBumcbUYWZ5sGn7Lia/8g7/dGpfTj6ue9rlWEpyGTxzgOGSBksqIfMBf3m9PquB0QCSTiQTPFWSegB/Ae6MiFfrOkvqIqlvcr8YuAxYnDzuk9y2I3PQwqRksXLgGkkdJA0GhgOv52C8ZnYIk15cwY49NUwYMzztUixFOQueiKgGbiPzIf/fyRy9tkjS3ZI+n3SbCHxD0gIys5QbIyKS5YaROSptfvLTh8znQOWS3gQWABv4OGCulbSUTBCtA36T1LGIzKzqbeA54Fs+os0s/9Zv3cnvZr/LF87ox7A+XdMux1KkzPu8ZSsrKwtfFsGseX3/P9/i96+tZubESxh4dKe0y7EckDQ3IsoO1c9nLjCznKv8x0c89vpqrj57gEPHHDxmlns/m7EMSYwfNSztUqwFcPCYWU6trNrOH99Yy1fPHUjf7h3TLsdaAAePmeXU/TOWUVLUjlsvGZp2KdZCOHjMLGeWvL+N8gXruOH8QfTpWpp2OdZCOHjMLGd+Mn0pXUqK+ebFQ9IuxVoQB4+Z5cTCyi08t+h9brpwMD06laRdjrUgDh4zy4l7py+hR6f2fP1Tg9MuxVoYB4+ZNbuKVZt5YUkVt1w0lG6l7dMux1oYB4+ZNbt7py2lV5cO3HD+8WmXYi2Qg8fMmtWryzcye+UmvvXpoXQqyeWVV6xQOXjMrNlEBPdMW0Lf7qVce44vqGgNc/CYWbOZtWQD81Z/wPhRwyltX5R2OdZCOXjMrFnU1gb3TlvKwJ6duKqsf9rlWAvm4DGzZjF10fssWreV74wZTvsiv7XYgfm3w8yOWE1tcO/0pQzt3ZkrTu+XdjnWwjl4zOyIlS9Yy/IN27l97EiK2intcqyFc/CY2RHZU1PLT59fxol9u/HZU45NuxwrAA4eMzsif5xbybubPuK740bQzrMdawQHj5kdtl3VNfxsxjJOH9CDUSf0SbscKxAOHjM7bI+9tpp1W3by3XEjkTzbscZx8JjZYdmxu4ZfzFrBuYN7csGwo9MuxwqIg8fMDsvvZq9i4/ZdfPdSz3asaRw8ZtZk23buYdKLK7h4RG/OHtQz7XKswDh4zKzJJr+yin98tIeJ40akXYoVIAePmTXJBx/t5tcvr2TcScdwav8eaZdjBcjBY2ZN8tBLK9m+u5rbPduxw+TgMbNG27h9F795dRWXn3ocJxzbLe1yrEDlNHgkfUbSEknLJd3RwPMDJc2SNE/Sm5IuS9rHSporaWFyOyprmeckLZC0SNIkSUVJ++mS/iZpvqQKSeck7ZdI2pK0z5f0/VyO2aw1++WsFeyqruE7Y4anXYoVsJxdlzYJhAeAsUAlMEdSeUS8ndXte8CUiHhQ0knAs8AgYCNweUSsk3QKMBWoO+Xt1RGxVZnjN58ErgIeB34M/DAi/isJsB8DlyTLvBwRn8vVWM3agve27ODfX3uXK8/sz5DeXdIuxwpYLmc85wDLI2JlROwmEw5X1OsTQN18vTuwDiAi5kXEuqR9EVAqqUPy3NakvRgoSdZxwHWZWfP4xczlRAT/fbRnO3Zkchk8/YA1WY8r+XjWUucHwHWSKsnMdsY3sJ4rgXkRsauuQdJUYAOwjcysB+A7wP+VtAa4B7gzax3nJbvn/kvSyQ0VK+nmZBddRVVVVWPHaNYmrNn8EU/MWcM1Zw9kQM9OaZdjBS6XwdPQV5mj3uNrgUcioj9wGfCopL01JSHxI+CWfVYScSnQF+gA1H3+cyswISIGABOAf0va3wCOj4jTgJ8DzzRUbEQ8FBFlEVHWu3fvxo/SrA24f8YyitqJ20YNS7sUawVyGTyVwICsx/3Zf/fXTcAUgIiYDZQCvQAk9QeeBq6PiBX1Vx4RO4FyPt59dwPwVHL/D2R29RERWyNie3L/WaC9pF5HOjiztmL5hu089UYl//LJ4zmmW2na5VgrkMvgmQMMlzRYUglwDZmgyLYaGA0g6UQywVMlqQfwF+DOiHi1rrOkLpL6JveLycySFidPrwMuTu6PApYl/Y5NDkQgOdKtHbCpmcdq1mr99PmllLYv4puXDE27FGslcnZUW0RUS7qNzBFpRcDkiFgk6W6gIiLKgYnAw5ImkNkNd2NERLLcMOAuSXclqxxHZvddeXKgQREwE5iUPP8N4P4kkHYCNyftXwZulVQN7ACuiYj6u/zMrAF/f28rf37zPW779DB6demQdjnWSsjvwfsrKyuLioqKtMswS903flfB31Zu4pX/MYrundqnXY61cJLmRkTZofr5zAVm1qD5az5g+tvrufnCIQ4da1YOHjNr0L3TlnBUp/Z87VOD0y7FWhkHj5nt57WVm3h52UZuvWQoXTrk7KNga6McPGa2j4jg3mlL6dO1A//yyUFpl2OtkIPHzPbx8rKNvL5qM7eNGkbHkqK0y7FWyMFjZntlZjtL6NejI185e8ChFzA7DA4eM9vr+b9vYEHlFv776GF0KPZsx3LDwWNmANTWZmY7g47uxJVn9k+7HGvFHDxmBsCzb73H4ve3MWHsCIqL/NZguePfLjOjuqaW+6YvZcQxXfjcqcelXY61cg4eM+OZ+etYWfUht48dQVG7hq5oYtZ8HDxmbdzu6lrun7GUU/p149KTj027HGsDHDxmbdwf5q5hzeYdTBw3kuQKImY55eAxa8N27qnh5zOWc9bxR3HJCF951/LDwWPWhv3Ha6t5f+tOJo4b4dmO5Y2Dx6yN+nBXNQ++sJzzhx7N+UN9NXjLHwePWRv129mr2Lh9NxPHjUy7FGtjHDxmbdDWnXv41YsrGXVCH846/qi0y7E2xsFj1gb9+uV32LJjD7ePHZF2KdYGOXjM2pjNH+5m8ivv8NlTjuWUft3TLsfaIAePWRvzq5dW8OHuas92LDUOHrM2ZMO2nfz2r6v4wun9GH5M17TLsTbKwWPWhvxy1gr21ATfHj087VKsDXPwmLURaz/Ywe9fW81VZ/VnUK/OaZdjbZiDx6yN+MXMZQCM92zHUubgMWsDVm38kCkVlfzzuQPp16Nj2uVYG+fgMWsDfjZjGe2LxH+7ZGjapZjlNngkfUbSEknLJd3RwPMDJc2SNE/Sm5IuS9rHSporaWFyOyprmeckLZC0SNIkSUVJ++mS/iZpvqQKSeck7ZL0s6SGNyWdmcsxm7U0y9Zv4+n5a7nhvEH06VaadjlmuQueJBAeAD4LnARcK+mket2+B0yJiDOAa4BfJu0bgcsj4hPADcCjWctcHRGnAacAvYGrkvYfAz+MiNOB7yePSV5/ePJzM/Bgsw3SrAD85PmldC4p5paLPduxliGXM55zgOURsTIidgOPA1fU6xNAt+R+d2AdQETMi4h1SfsioFRSh+S5rUl7MVCSrOOA60pe83eR8Tegh6S+zTRGsxbtrbVbeHbh+3z9U4Pp2bkk7XLMgMybd670A9ZkPa4Ezq3X5wfANEnjgc7AmAbWcyUwLyJ21TVImkom2P4LeDJp/g4wVdI9ZAL1/IPU0Q94r+lDMissP5m+lO4d23PTpwanXYrZXrmc8TR0Vamo9/ha4JGI6A9cBjwqaW9Nkk4GfgTcss9KIi4F+gIdgLrPf24FJkTEAGAC8G9NqANJNyefDVVUVVUdamxmLd4bq//BjMUbuPmiIXTv2D7tcsz2ymXwVAIDsh735+PdX3VuAqYARMRsoBToBSCpP/A0cH1ErKi/8ojYCZTz8e67G4Cnkvt/IDMjamwdRMRDEVEWEWW9e/sSwFb47p22hF5dSrjx/EFpl2K2j1wGzxxguKTBkkrIHDxQXq/PamA0gKQTyQRPlaQewF+AOyPi1brOkrrUfT4jqZjMLGlx8vQ64OLk/ihgWXK/HLg+Obrtk8CWiPBuNmvV/rpiI68u38Stlwyjc4dc7lE3a7qc/UZGRLWk24CpQBEwOSIWSbobqIiIcmAi8LCkCWR2f90YEZEsNwy4S9JdySrHkdltVp4caFAEzAQmJc9/A7g/CaSdZI5gA3iWTEAtBz4CvparMZu1BBHBfdOWcmy3Ur567sC0yzHbjyL2+7ijzSsrK4uKioq0yzA7LC8s2cCNv5nD//zCKVz3yePTLsfaEElzI6LsUP185gKzViQiuHfaUvof1ZGrywYcegGzFDh4zFqRqYvWs3DtFr49ejglxf7ztpbJv5lmrURNbXDf9CUM6d2ZL57RL+1yzA7IwWPWSvz5zXUsXb+dCWNGUFzkP21rufzbadYKVNfU8tPnl3HCsV35p0/4jFDWsjl4zFqBp95YyzsbP+T2sSNo166hk3WYtRwOHrMCt6u6hvtnLOO0/t0Ze9IxaZdjdkgOHrMCN2XOGtZ+sIOJ40YiebZjLZ+Dx6yA7dxTw89nLuecQT25cHivtMsxaxQHj1kBe3T2u2zYtouJ40Z4tmMFw8FjVqC276rmwRdXcOHwXpw75Oi0yzFrtAMGj6RLJX25gfavShqb27LM7FAeefUdNn+4m4njRqZdilmTHGzG80PgxQbaZwB356YcM2uMLR/t4VcvrWTMicdw+oAeaZdj1iQHC55OEbHfpTgj4n0yl6k2s5Q8/PJKtu2s5vaxI9IuxazJDhY8pcm1bfYhqT3QMXclmdnBbNq+i8mvvsM/ndqXk47rlnY5Zk12sOB5isxF2vbObpL7k/j4EtNmlmeTXlzBzj01TBjj2Y4VpoMFz/eA9cC7kuZKegNYBVQlz5lZnq3fupPfzX6XL57Rn2F9uqRdjtlhOeClryOiGrhD0g/JXIYaYHlE7MhLZWa2nwdmLaemNvj26OFpl2J22A4YPJK+VK8pgB6S5kfEttyWZWb1rdn8EY+9vpqrzx7AwKM7pV2O2WE7YPAAlzfQ1hM4VdJNETEzRzWZWQN+PnMZkhg/atihO5u1YAfb1fa1htolHQ9MAc7NVVFmtq+VVdv54xtrueG8QfTt7oNKrbA1+ZQ5EfEu0D4HtZjZAdw/YxklRe249ZKhaZdidsSaHDySTgB25aAWM2vAkve3Ub5gHTdeMIjeXTukXY7ZETvYwQV/InNAQbaeQF/gulwWZWYfu2/6ErqUFHPLRUPSLsWsWRzs4IJ76j0OYDOZ8LkOmJ2roswsY2HlFqYuWs+EMSPo0akk7XLMmsXBDi7Ye4JQSacD/wxcDbwD/DH3pZnZvdOX0KNTe77+qUFpl2LWbA62q20EcA1wLbAJeAJQRHw6T7WZtWkVqzbzwpIq7vjsCXQt9fE81nocbFfbYuBl4PKIWA4gaUJeqjJr4yKCe6YtoVeXDlx/3vFpl2PWrA52VNuVwPvALEkPSxoNNOnaupI+I2mJpOWS7mjg+YGSZkmaJ+lNSZcl7WOT88MtTG5HZS3znKQFkhZJmiSpKGl/QtL85GeVpPlJ+yBJO7Kem9SUMZil4a8rNvG3lZu57dND6VRysP8fmhWeg33G8zTwdHJG6i8AE4BjJD0IPB0R0w624iQQHgDGApXAHEnlEfF2VrfvAVMi4kFJJwHPAoOAjWRmWusknQJMBfoly1wdEVuVucD8k8BVwOMR8ZWs174X2JL1Oisi4vRD/WOYtQR1s53jupdy7bkD0y7HrNkd8ns8EfFhRPxHRHwO6A/MB/abvTTgHDInFV0ZEbuBx4Er6q8eqLugSHdgXfKa8yJiXdK+iMy1gTokz21N2ouBEuod8p0E0tXAY42o0azFmbVkA/NWf8D40cPpUFyUdjlmza5JXyCNiM0R8auIGHXo3vQD1mQ9ruTjWUudHwDXSaokM9sZ38B6rgTmRcTeL61KmgpsALaRmfVkuxBYHxHLstoGJ7vzXpR0YSNqN0tFbW1wz9SlHH90J758Vv+0yzHLiSafuaAJGvo8qP4XUq8FHomI/sBlwKOS9tYk6WTgR8At+6wk4lIyX2TtANQPwWvZd7bzHjAwIs4Abgd+L2m/yzZKullShaSKqqr9rvhtlhfPLXqft9/bynfGDKd9US7/PM3Sk8vf7EpgQNbj/iS70rLcROaEo0TEbKAU6AUgqT/wNHB9RKyov/KI2AmUk7X7LrlU95fIHPpd129XRGxK7s8FVgD7XboxIh6KiLKIKOvdu3eTB2t2pGpqg/umL2VYny58/rT6OwfMWo9cBs8cYLikwZJKyHwnqLxen9XAaABJJ5IJnipJPYC/AHdGxKt1nSV1kdQ3uV9MZpa0OGt9Y4DFEVGZtUzvrCPfhgDDgZXNOlKzZlC+YC3LN2zn9rEjKGrXpANIzQpKzo7TjIhqSbeROSKtCJgcEYsk3Q1UREQ5MBF4OPl+UAA3RkQkyw0D7pJ0V7LKcWR235UnBxoUATOB7MOjr2H/gwouAu6WVA3UAN+MiM25GLPZ4dpTU8tPpi/jpL7d+MzJx6ZdjllOKaL+xy5WVlYWFRUVaZdhbchjr6/mzqcWMvnGMkadcEza5ZgdFklzI6LsUP386aVZynbuqeFnM5ZxxsAefHpkn7TLMcs5B49Zyh5/fTXvbdnJd8eNJPM1NLPWzcFjlqIdu2v4xawVfHJIT84fenTa5ZjlhYPHLEW/nb2Kjdt3ebZjbYqDxywl23buYdKLK7hkZG/KBvVMuxyzvHHwmKVk8iur+OCjPUwcOzLtUszyysFjloIPPtrNr19eyaUnH8Mn+ndPuxyzvHLwmKXgVy+tZPvuam73bMfaIAePWZ5VbdvFI6+u4vOnHcfIY7umXY5Z3jl4zPLswRdWsLumlm+PHp52KWapcPCY5dF7W3bw76+9y5Vn9mNI7y5pl2OWCgePWR79YuZyIoLxozzbsbbLwWOWJ6s3fcQTc9ZwzdkDGdCzU9rlmKXGwWOWJ/fPWEZRO3HbqGFpl2KWKgePWR4s37Cdp+dVcv15x3NMt9K0yzFLlYPHLA9++vxSStsX8c2Lh6ZdilnqHDxmOfb2uq38+c33+PoFgzm6S4e0yzFLnYPHLMfum76UbqXFfOOiIWmXYtYiOHjMcmj+mg94/u/rufmiIXTv2D7tcsxaBAePWQ7dO20JPTuXcOMFg9MuxazFcPCY5chrKzfx8rKN3HrxULp0KE67HLMWw8FjlgMRwb3TltKnawf+5bzj0y7HrEVx8JjlwMvLNvL6qs2MHzWM0vZFaZdj1qI4eMyaWWa2s4R+PTpy9dkD0i7HrMVx8Jg1s+f/voEFlVv49ujhdCj2bMesPgePWTOqrc3Mdgb36syXzuyXdjlmLZKDx6wZ/WXheyx+fxvfGTOc4iL/eZk1xH8ZZs2kuqaWnzy/lJHHdOXyU49LuxyzFiunwSPpM5KWSFou6Y4Gnh8oaZakeZLelHRZ0j5W0lxJC5PbUVnLPCdpgaRFkiZJKkran5A0P/lZJWl+1jJ3JjUskXRpLsdsbdcz89exsupDJowdQbt2SrscsxYrZ99qSwLhAWAsUAnMkVQeEW9ndfseMCUiHpR0EvAsMAjYCFweEesknQJMBep2mF8dEVslCXgSuAp4PCK+kvXa9wJbkvsnAdcAJwPHAc9LGhERNbkau7U9u6truX/GUj7RrzuXnnxM2uWYtWi5nPGcAyyPiJURsRt4HLiiXp8AuiX3uwPrACJiXkSsS9oXAaWSOiTPbU3ai4GSZB17JYF0NfBY0nQFmWDaFRHvAMuT2syazZSKNazZvIOJ40aQ+RU0swPJZfD0A9ZkPa7k41lLnR8A10mqJDPbGd/Aeq4E5kXErroGSVOBDcA2MrOebBcC6yNiWRPqMDtsO/fU8POZyyg7/iguHtE77XLMWrxcBk9D/+2Leo+vBR6JiP7AZcCjkvbWJOlk4EfALfusJOJSoC/QARjFvq7l49lOY+tA0s2SKiRVVFVVNTwiswb8x2urWb91FxPHjfRsx6wRchk8lUD217b7k+xKy3ITMAUgImYDpUAvAEn9gaeB6yNiRf2VR8ROoJys3XeSioEvAU80sQ4i4qGIKIuIst69/b9Wa5wPd1Xz4AvLuWDY0Zw39Oi0yzErCLkMnjnAcEmDJZWQ+YC/vF6f1cBoAEknkgmeKkk9gL8Ad0bEq3WdJXWR1De5X0xmlrQ4a31jgMURUZnVVg5cI6mDpMHAcOD1ZhyntWGP/HUVG7fvZuK4kWmXYlYwcnZUW0RUS7qNzBFpRcDkiFgk6W6gIiLKgYnAw5ImkNn9dWNERLLcMOAuSXclqxxHZrdZeXKgQREwE5iU9bLXsO9uNpLXnAK8DVQD3/IRbdYctuzYw69eXMHoE/pw5sCj0i7HrGAoYr+PO9q8srKyqKioSLsMa+Hum76Un81Yxp/Hf4pT+nVPuxyz1EmaGxFlh+rnMxeYHYbNH+5m8ivvcNknjnXomDWRg8fsMPzqpRV8uLuaCWNGpF2KWcFx8Jg10YatO/ntX1fxxdP7MfyYrmmXY1ZwHDxmTfTLF1awpyb49pjhaZdiVpAcPGZNsPaDHfz+tdVcXdaf44/unHY5ZgXJwWPWBL+YmTkT022jPNsxO1wOHrNGWrXxQ6ZUVPLP5w6kX4+OaZdjVrAcPGaNdP+MZbQvEv/t00PTLsWsoDl4zBph2fptPDN/LTecP4g+XUvTLsesoDl4zBrhJ88vpXNJMd+8yLMdsyPl4DE7hLfWbuHZhe9z06cGc1TnkrTLMSt4Dh6zQ7hv+lK6d2zPTRcOTrsUs1bBwWN2EHPf/QczF2/glouH0K20fdrlmLUKDh6zg7hv+hJ6dSnhxvMHpV2KWavh4DE7gL+u2Miryzdx6yXD6FSSs0tXmbU5Dh6zBkQE905byrHdSvnquQPTLsesVXHwmDXghaVVzH33H4wfPYzS9kVpl2PWqjh4zOrJzHaWMKBnR646a0Da5Zi1Og4es3qmLlrPW2u38u3RIygp9p+IWXPzX5VZlpra4L7pSxjauzNfPKNf2uWYtUoOHrMsf35zHUvXb2fC2BEUtVPa5Zi1Sg4es0R1TS0/mb6UE47tymWn9E27HLNWy8FjlnjqjbWs2vQRE8eNpJ1nO2Y54+AxA3ZV13D/jGWcNqAHY07sk3Y5Zq2ag8cMeGLOGtZ+sIPvjhuB5NmOWS45eKzN27G7hp/PXM45g3vyqWG90i7HrNVz8Fib9+9/e5eqbbuYONazHbN8cPBYm7Z9VzUPvriCC4f34twhR6ddjlmbkNPgkfQZSUskLZd0RwPPD5Q0S9I8SW9KuixpHytprqSFye2orGWek7RA0iJJkyQVZT03Pnm9RZJ+nLQNkrRD0vzkZ1Iux2yF5TevvMPmD3fz3XEj0y7FrM3I2bnek0B4ABgLVAJzJJVHxNtZ3b4HTImIByWdBDwLDAI2ApdHxDpJpwBTgbqvkV8dEVuV2SfyJHAV8LikTwNXAKdGxC5J2YcmrYiI03M1VitMWz7aw0Mvr2TsScdw2oAeaZdj1mbkcsZzDrA8IlZGxG7gcTLBkC2Absn97sA6gIiYFxHrkvZFQKmkDslzW5P2YqAkWQfArcD/iYhdSb8NzT8ka00efnkl23ZWc/vYEWmXYtam5DJ4+gFrsh5X8vGspc4PgOskVZKZ7YxvYD1XAvPqAgVA0lRgA7CNzKwHYARwoaTXJL0o6eysdQxOdue9KOnCIxmUtQ6btu9i8qvv8LlT+3Ji326HXsDMmk0ug6ehw4Oi3uNrgUcioj9wGfCopL01SToZ+BFwyz4ribgU6At0AOo+/ykGjgI+CfwrMCXZHfceMDAizgBuB34vab93Gkk3S6qQVFFVVdXkwVphmfTiCnbuqWGCZztmeZfL4KkEsi9m0p9kV1qWm4ApABExGygFegFI6g88DVwfESvqrzwidgLlfLz7rhJ4KjJeB2qBXhGxKyI2JcvMBVaQmR3VX99DEVEWEWW9e/c+zCFbIVi/dSe/m/0uXzqzP0N7d0m7HLM2J5fBMwcYLmmwpBLgGjJBkW01MBpA0olkgqdKUg95BB9+AAAIyUlEQVTgL8CdEfFqXWdJXST1Te4Xk5klLU6efoZk9iNpBJnPfzZK6l135JukIcBwYGUOxmsF4hczl1NTG3x79PC0SzFrk3J2VFtEVEu6jcwRaUXA5IhYJOluoCIiyoGJwMOSJpDZDXdjRESy3DDgLkl3JascR2b3XXlyoEERMBOoOzx6MjBZ0lvAbuCGZF0XAXdLqgZqgG9GxOZcjdtatjWbP+LxOav5ytkDGNCzU9rlmLVJiqj/sYuVlZVFRUVF2mVYDvyPJxfwzPx1vPivl9C3e8e0yzFrVSTNjYiyQ/XzmQuszVhZtZ0/vrGWf/nk8Q4dsxQ5eKzN+OnzyygpasetlwxNuxSzNs3BY23C4ve38qc31/G1CwbRq0uHtMsxa9McPNYm/GT6UrqUFHPzRUPSLsWszXPwWKu3sHILUxet5xsXDaFHp5K0yzFr83J2OLU1n4igpjaoiaC2FmqSx7W1QXVtUFv3fNb92sg8l+mXtUwE1TVZy0RmPfstE0FNLZnnkvbaeq9Rt+ze5+qWyaqn/mvss8zefgdZJus2u+7a4ID9a2r3vV9dGxzVqT1fu2BQ2pvSzHDwNKvlG7Zz1zNvHeDNdd/7e0PkgG/g+77JFoKidsr8KHPbTlltSXu7+vf18fOZxyTLig7t29FODfQvyn4NUdSO/V9D2esUY086hq6l7dP+JzIzHDzNLKiurd37ptmxmd40s9+865ZpJ1Hcbt9+dbfFRdr7hr33jbsdFLVrl/Rjn9co3qef9nmzr6v3oMskr21m1hgOnmY0rE9X/vDN89Muw8ysRfPBBWZmllcOHjMzyysHj5mZ5ZWDx8zM8srBY2ZmeeXgMTOzvHLwmJlZXjl4zMwsr3wF0gZIqgLePYJV9AI2NlM5aWot4wCPpSVqLeMAj6XO8RHR+1CdHDw5IKmiMZd/belayzjAY2mJWss4wGNpKu9qMzOzvHLwmJlZXjl4cuOhtAtoJq1lHOCxtEStZRzgsTSJP+MxM7O88ozHzMzyysFzhCStkrRQ0nxJFUlbT0nTJS1Lbo9Ku87GOMBYfiBpbdI2X9Jladd5KJJ6SHpS0mJJf5d0XgFvk4bGUojbZGRWvfMlbZX0nULcLgcZSyFulwmSFkl6S9JjkkolDZb0WrJNnpBU0uyv611tR0bSKqAsIjZmtf0Y2BwR/0fSHcBREfH/plVjYx1gLD8AtkfEPWnV1VSSfgu8HBG/Tv5oOgH/H4W5TRoay3cosG2STVIRsBY4F/gWBbhd6tQby9cooO0iqR/wCnBSROyQNAV4FrgMeCoiHpc0CVgQEQ8252t7xpMbVwC/Te7/FvhCirW0KZK6ARcB/wYQEbsj4gMKcJscZCyFbjSwIiLepQC3Sz3ZYylExUBHScVk/lPzHjAKeDJ5PifbxMFz5AKYJmmupJuTtmMi4j2A5LZPatU1TUNjAbhN0puSJhfArpAhQBXwG0nzJP1aUmcKc5scaCxQWNukvmuAx5L7hbhdsmWPBQpou0TEWuAeYDWZwNkCzAU+iIjqpFsl0K+5X9vBc+QuiIgzgc8C35J0UdoFHYGGxvIgMBQ4ncwv570p1tcYxcCZwIMRcQbwIXBHuiUdtgONpdC2yV7J7sLPA39Iu5Yj1cBYCmq7JMF4BTAYOA7oTOZvv75m/zzGwXOEImJdcrsBeBo4B1gvqS9AcrshvQobr6GxRMT6iKiJiFrgYTLja8kqgcqIeC15/CSZN+9C3CYNjqUAt0m2zwJvRMT65HEhbpc6+4ylALfLGOCdiKiKiD3AU8D5QI9k1xtAf2Bdc7+wg+cISOosqWvdfWAc8BZQDtyQdLsB+M90Kmy8A42l7k0h8UUy42uxIuJ9YI2kkUnTaOBtCnCbHGgshbZN6rmWfXdNFdx2ybLPWApwu6wGPimpkyTx8d/KLODLSZ+cbBMf1XYEJA0hMzOAzG6R30fE/5J0NDAFGEhm414VEZtTKrNRDjKWR8nsOghgFXBL3T75lkrS6cCvgRJgJZmjjdpRYNsEDjiWn1Fg2wRAUidgDTAkIrYkbQX3twIHHEsh/q38EPgKUA3MA/4fMp/pPA70TNqui4hdzfq6Dh4zM8sn72ozM7O8cvCYmVleOXjMzCyvHDxmZpZXDh4zM8srB4+ZmeWVg8esQEh6RNKXD93TrGVz8JiZWV45eMyOgKRByQXaHk4uqDVNUkdJL0gqS/r0Sq51hKQbJT0j6U+S3pF0m6Tbk7NP/01Sz0a+7lmSXkzOJD4163xn35A0R9ICSX9MTofSXZmL/LVL+nSStEZSe0lDJT2XrOdlSSckfa5KLg62QNJLOfnHszbLwWN25IYDD0TEycAHwJWH6H8K8M9kTiL5v4CPkrNPzwauP9SLSWoP/Bz4ckScBUxO1gOZC3idHRGnAX8HbkpO6bIAuDjpczkwNTkx5EPA+GQ93wV+mfT5PnBpsp7PH6oms6YoPnQXMzuEdyJifnJ/LjDoEP1nRcQ2YJukLcCfkvaFwKmNeL2RZMJreubcjhSROQ0/wCmS/ifQA+gCTE3anyBzTq5ZZK4h80tJXcicjfgPyXoAOiS3rwKPJFelfKoRNZk1moPH7Mhln0CxBuhI5qSLdXsUSg/SvzbrcS2N+5sUsCgizmvguUeAL0TEAkk3Apck7eXA/0525Z0FzCRz/ZUPIuL0+iuJiG9KOhf4J2C+pNMjYlMjajM7JO9qM8uNVWTe4OHjU8w3lyVAb0nnQWbXm6STk+e6Au8lu+O+WrdARGwHXgfuB/6cXDdmK/COpKuS9UjSacn9oRHxWkR8H9gIDGjmMVgb5uAxy417gFsl/RXo1ZwrjojdZMLsR5IWAPPJ7DIDuAt4DZgOLK636BPAdcltna8CNyXrWUTmipQA/1fSQklvAS+R+YzIrFn4sghmZpZXnvGYmVle+eACsxZG0gPABfWa74+I36RRj1lz8642MzPLK+9qMzOzvHLwmJlZXjl4zMwsrxw8ZmaWVw4eMzPLq/8fVKj06H0nYzQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "n_leafs = len(num_leaves_s)\n",
    "\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_means, yerr=test_stds,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_means, yerr=train_stds,label = ' Train')\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'AUC' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.82363374, 0.82363543, 0.82390134, 0.82390134])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 性能抖动，取系统推荐值：70"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. min_child_samples\n",
    "叶子节点的最小样本数目\n",
    "\n",
    "叶子节点数目：70，共2类，平均每类35个叶子节点\n",
    "每棵树的样本数目数目最少的类（稀有事件）的样本数目：8w * 4/5 * 1.4% = 840\n",
    "所以每个叶子节点约840/35 = 25个样本点\n",
    "\n",
    "搜索范围：10-50"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 4 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:   27.8s\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:   44.4s remaining:    4.8s\n",
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:   46.0s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=6,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'min_child_samples': range(10, 50, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 70,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(10,50,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.824153024427979\n",
      "{'min_child_samples': 40}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.8221198 , 0.82390134, 0.82299763, 0.82415302])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 再次细调"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 2 candidates, totalling 10 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done   6 out of  10 | elapsed:   18.9s remaining:   12.6s\n",
      "[Parallel(n_jobs=4)]: Done  10 out of  10 | elapsed:   24.0s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.7, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=6,\n",
       "        min_child_samples=20, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'min_child_samples': range(40, 60, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 70,\n",
    "          'max_depth': 6,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "min_child_samples_s = range(40,60,10) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.824153024427979\n",
      "{'min_child_samples': 40}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### min_child_samples=40"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 列采样参数 sub_feature/feature_fraction/colsample_bytree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 5 candidates, totalling 25 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:   30.9s\n",
      "[Parallel(n_jobs=4)]: Done  25 out of  25 | elapsed:  1.1min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=1.0, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=6,\n",
       "        min_child_samples=40, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9]},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 70,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40\n",
    "          #'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(5,10)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8256883187278984\n",
      "{'colsample_bytree': 0.5}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, test_means)\n",
    "#plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = str(max_depths[i]) +' Test')\n",
    "#plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = str(max_depths[i]) +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再调小一点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 3 candidates, totalling 15 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  12 out of  15 | elapsed:   30.3s remaining:    7.5s\n",
      "[Parallel(n_jobs=4)]: Done  15 out of  15 | elapsed:   35.3s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=1.0, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.1, max_depth=6,\n",
       "        min_child_samples=40, min_child_weight=....0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid=True, n_jobs=4,\n",
       "       param_grid={'colsample_bytree': [0.3, 0.4, 0.5]},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='roc_auc', verbose=5)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 70,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40\n",
    "          #'colsample_bytree': 0.7,\n",
    "         }\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(3,6)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"roc_auc\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "#grid_search.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8266808388331044\n",
      "{'colsample_bytree': 0.4}\n"
     ]
    }
   ],
   "source": [
    "# examine the best model\n",
    "print(grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### colsample_bytree=0.4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化参数lambda_l1(reg_alpha), lambda_l2(reg_lambda)感觉不用调了"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 减小学习率，调整n_estimators"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 549\n",
      "best cv score: 0.8476824572072733\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 70,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40,\n",
    "          'colsample_bytree': 0.4\n",
    "         }\n",
    "n_estimators_2 = get_n_estimators(params , X_train , y_train, early_stopping_rounds=50)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用所有训练数据，采用最佳参数重新训练模型\n",
    "由于样本数目增多，模型复杂度稍微扩大一点？\n",
    "num_leaves增多5\n",
    "#min_child_samples按样本比例增加到15"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(boosting_type='goss',\n",
       "        categorical_feature=[0, 1, 3, 5, 6, 12, 15, 16, 17, 18, 19, 20],\n",
       "        class_weight=None, colsample_bytree=0.4, importance_type='split',\n",
       "        is_unbalance=True, learning_rate=0.01, max_depth=6,\n",
       "        min_child_samples=40, min_child_weight=0.001, min_split_gain=0.0,\n",
       "        n_estimators=100, n_jobs=4, num_leaves=75, objective='binary',\n",
       "        random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "        subsample=1.0, subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'binary',\n",
    "          'is_unbalance':True,\n",
    "          'categorical_feature': [0,1,3,5,6,12,15,16,17,18,19,20],\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          #'n_estimators':n_estimators_1,\n",
    "          'num_leaves': 75,\n",
    "          'max_depth': 6,\n",
    "          'min_child_samples':40,\n",
    "          'colsample_bytree': 0.4\n",
    "         }\n",
    "\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "lg.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存模型，用于后续测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle\n",
    "\n",
    "cPickle.dump(lg, open(\"HappyBank_LightGBM_.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"importance\":list(lg.feature_importances_.T)})\n",
    "df = df.sort_values(by=['importance'],ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>importance</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Monthly_Income</td>\n",
       "      <td>793</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>Loan_Amount_Submitted</td>\n",
       "      <td>532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>Loan_Amount_Applied</td>\n",
       "      <td>401</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Existing_EMI</td>\n",
       "      <td>392</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>Age</td>\n",
       "      <td>360</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Processing_Fee</td>\n",
       "      <td>348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>Interest_Rate</td>\n",
       "      <td>348</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>EMI_Loan_Submitted</td>\n",
       "      <td>245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>Loan_Tenure_Applied</td>\n",
       "      <td>237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Employer_Name</td>\n",
       "      <td>234</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>Salary_Account</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>City</td>\n",
       "      <td>196</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>Loan_Tenure_Submitted</td>\n",
       "      <td>195</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>Var5</td>\n",
       "      <td>135</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>Source</td>\n",
       "      <td>111</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>Gender</td>\n",
       "      <td>90</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>Var1</td>\n",
       "      <td>89</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Filled_Form</td>\n",
       "      <td>86</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Device_Type</td>\n",
       "      <td>83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>Var4</td>\n",
       "      <td>83</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Mobile_Verified</td>\n",
       "      <td>66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Var2</td>\n",
       "      <td>23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  columns  importance\n",
       "13         Monthly_Income         793\n",
       "9   Loan_Amount_Submitted         532\n",
       "8     Loan_Amount_Applied         401\n",
       "4            Existing_EMI         392\n",
       "21                    Age         360\n",
       "14         Processing_Fee         348\n",
       "7           Interest_Rate         348\n",
       "2      EMI_Loan_Submitted         245\n",
       "10    Loan_Tenure_Applied         237\n",
       "3           Employer_Name         234\n",
       "15         Salary_Account         200\n",
       "0                    City         196\n",
       "11  Loan_Tenure_Submitted         195\n",
       "20                   Var5         135\n",
       "16                 Source         111\n",
       "6                  Gender          90\n",
       "17                   Var1          89\n",
       "5             Filled_Form          86\n",
       "1             Device_Type          83\n",
       "19                   Var4          83\n",
       "12        Mobile_Verified          66\n",
       "18                   Var2          23"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.bar(range(len(lg.feature_importances_)), lg.feature_importances_)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
